package com.zf.yichat.service;

import com.zf.yichat.dto.MemberLevelDto;
import com.zf.yichat.dto.UserInviteSearchDto;
import com.zf.yichat.dto.UserLowerLevelDto;
import com.zf.yichat.dto.UserTasksInfoDto;
import com.zf.yichat.model.*;
import com.zf.yichat.utils.response.FsPage;
import com.zf.yichat.utils.response.FsResponse;
import com.zf.yichat.vo.ThirdType;

import java.math.BigDecimal;
import java.util.List;

/**
 * 一句话描述功能
 *
 * @author fengsong
 * @date create in 15:42 2019/5/28 2019
 */
public interface UserService {
    /**
     * 注册用户
     */
    UserIm add(User user);
    /**
     * 删除用户
     */
    void   deleteUser (Long userId);
    /**
     * 注册第三方用户
     */
    String addThird(String nick, String avatar, String openId, String unionId, ThirdType thirdType);

    User selectByMobile(String mobile);

    User selectByAlipayAccount(String alipayAccount);

    List<User> selectByIdNumber(String idNumber);

    List<UserDevice> selectDeviceByUserId(Long userId);

    UserDevice selectDevice(Long id, String deviceId);

    void update(User user);

    void updateNull(User user);


    /**
     * 查询用户IM信息
     *
     * @param userId 用户ID
     */
    UserIm selectIm(Long userId);

    /**
     * 更新用户设备
     *
     * @param userId   用户ID
     * @param deviceId 设备号
     */
    void updateDevice(Long userId, String deviceId);

    /*
     * 主键查询用户
     * @param userId 主键ID
     */
    User selectById(Long userId);

    /**
     * 查询用户是否是会员
     * @param userId
     * @return
     */
    boolean isMember(Long userId);

    /**
     * 搜索
     */
    List<User> searchByMobileOrAppId(String content);

    /**
     * 通过第三方信息查询注册用户信息
     *
     * @param openId
     * @param unionId
     */
    User selectByThirdAccount(String openId, String unionId);

    List<User> selectList(List<Long> idList);


    /**
     * 后台用户列表
     *
     * @param page   分页信息
     * @param nick   昵称
     * @param status 状态
     * @param mobile 手机号
     * @param ucode  唯一码
     */
    FsResponse selectIndexList(FsPage page, String nick, Integer status, String mobile, String ucode);

    /**
     * 添加银行卡号
     */
    void adBankCard(UserBank userBank);

    List<UserBank> selectBankList(Long userId);
    List<UserBankXs> selectBankList2(Long userId);

    void deleteBank(Integer bankId);
    void deleteBank2(Integer bankId);

    User selectByAppId(String mobile);

    void updateTimestamp(Long userId, Long time);

    Long getTimestamp(Long userId);

    //清理用户
    void crashUser(List<Long> userIds);

    /**
     * 用户签到接口
     * @param userId
     * @param isSign
     * @return
     */
    FsResponse recordSign(Long userId, boolean isSign);

    /**
     * 用户签到接口-获取积分
     * @param userId
     * @param isSign
     * @return
     */
    FsResponse recordSignForIntegral(Long userId, boolean isSign);


    /**
     * 用户签到接口-获取积分和余额
     * @param userId
     * @param isSign
     * @return
     */
    FsResponse recordSignForAll(Long userId, boolean isSign);
    /**
     * 用户更新密码
     * @param userId
     * @param password
     */
    void updatePassword(Long userId, String password);

    User selectByUnionId(String unionId);

    void saveIp(String ipAddress, Long userId);

    List<UserIp> getUserIps(Long userId);

//    boolean saveValid(Long userId, String realName, String idNumber, String imgs);

    User selectByCode(String recommendCode);

    FsResponse selectRecommendList(FsPage page, Long userId);

    List<UserInviteSearchDto> selectRecommendList2(FsPage page, Long userId);

    boolean validStatus(Long userId);

    boolean realValidStatus(Long userId);

    boolean validStatus2(String ip, Long userId);

    boolean validOldUser(Integer viewCount, Integer withdrawCount, Integer receiveCount, Long userId);

    /**
     * 去Im工程更新用户密码
     * @param user
     * @param password
     */
    boolean updatePasswordToIm(User user, String password);

    /**
     * 编辑用户信息（后台）
     * @param updateUser
     * @return
     */
    int updateUser(User updateUser);


    WxUser selectWxUserList(Long id);

    /**
     * 查询用户昵称
     * @param userId
     * @return
     */
    String selectNickNameById(Long userId);

    /**
     * 增加用户积分记录
     * @param detail
     * @return
     */
    void insertUserIntegralDetail(UserIntegralDetail detail);

    /**
     * 更新用户表中的积分字段
     * @param score
     * @param userId
     * @return
     */
    void addIntegral(Integer score, Long userId);

    /**
     *当日玩游戏获取积分的值
     * @param decodeUserId
     * @return
     */
    Integer queryUserIntegralToday(Long decodeUserId);

    /**
     * 查询用户玩游戏获取积分的最近一次是否查过三分钟
     * @param decodeUserId
     * @return
     */
    Integer queryUserIntegralTimeDifference(Long decodeUserId);


    /**
     * 用户开通会员功能
     * @param userId
     * @param password
     * @param money
     * @return
     */
    FsResponse activateMembership(Long userId, String password, BigDecimal money);

    /**
     * 获取用户任务信息
     * @param userId
     * @return
     */
    UserTasksInfoDto getUserTasksInfo(Long userId);

    /**
     * 查询用户下级
     * @param userId
     * @return
     */
    List<UserLowerLevelDto> queryLowerLevel(Long userId);

    /**
     * 获取用户等级信息
     * @return
     */
    List<MemberLevelDto> getUserLevel();

    /**
     * 用户开通会员-多个会员类型
     * @param userId
     * @param password
     * @param money
     * @param type
     * @return
     */
    FsResponse activateMembershipForType(Long userId, String password, BigDecimal money, Integer type);

    /**
     * 连续签到-赠送积分
     * @param userId
     * @param isSign
     * @return
     */
    FsResponse continuousSign(Long userId, boolean isSign, String type);


    /**
     * 查询用户开通会员次数
     * @param userId
     * @return
     */
    Integer queryUserActivateMembership(Long userId, Integer type);

    /**
     * 根据父级邀请码查询当日的邀请人数
     * @param recommendCode
     * @return
     */
    int queryInvitationsNumToday(String recommendCode);

    int queryUserByMobile(String mobile);
}
